package uy.edu.ort.negocio;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.input.sax.XMLReaders;
import uy.edu.ort.dominio.Cliente;
import uy.edu.ort.excepciones.ClienteNoNombreException;
import uy.edu.ort.excepcionesdb.DBAgregarException;

/**
 *
 * @author 153287 - 154559
 */
public class CargaXmlClientes extends CargaXml {

    private static final Logger LOGGER = Logger.getLogger(CargaXmlClientes.class.getName());

    /**
     * Carga ruta xml
     * @param ruta 
     */
    public CargaXmlClientes(String ruta) {
        super(ruta);
        persistencia = Persistencia.ObtenerPersistencia();
    }

    /**
     * Parsea xml de clientes
     * @return 
     */
    @Override
    public WrapperCargaClientes parsearXml() {
        List<Cliente> clientes = new ArrayList<>();
        SAXBuilder b = new SAXBuilder(XMLReaders.XSDVALIDATING);
       
        WrapperCargaClientes carga = new WrapperCargaClientes();
        Document doc;
        try {
            File rutaClientes = new File(ruta);
            doc = b.build(rutaClientes);
            Element element = doc.getRootElement();
            List<Element> elementsCliente = element.getChildren("cliente");
            for (Element elementCliente : elementsCliente) {
                Cliente cliente;
                try {
                    cliente = parsearCliente(elementCliente);
                    clientes.add(cliente);
                } catch (ClienteNoNombreException ex) {
                    LOGGER.info(ex.getMessage());
                    carga.addErroneo();
                }
            }
            for (Cliente cliente : clientes) {
                try {
                    persistencia.guardaCliente(cliente);
                    carga.addExitoso();
                } catch (DBAgregarException ex) {
                    LOGGER.info(ex.getMessage());
                    carga.addErroneo();
                }
            }
        } catch (JDOMException ex) {
            carga.setMessage("ERROR: Ha ocurrido un error al intentar cargar el archivo " + ruta);
            LOGGER.info(ex.getMessage());
            return carga;
        } catch (FileNotFoundException ex) {
            carga.setMessage("ERROR: No se encontró el archivo " + ruta);
            LOGGER.info(ex.getMessage());
            return carga;
        } catch (IOException ex) {
            carga.setMessage("ERROR: Desconocido, no se pudo cargar el archivo " + ruta);
            LOGGER.info(ex.getMessage());
            return carga;
        }
        
         if (carga.getErroneos() > 0) {
            carga.setMessage("Se cargó con errores el archivo: " + ruta);
        } else {
            carga.setMessage("Se cargó con éxito el archivo: " + ruta);
        }
  
        return carga;
    }

    /**
     * Genera cliente a partir del nodo cliente
     * @param elementCliente
     * @return 
     */
    private static Cliente parsearCliente(Element elementCliente) throws ClienteNoNombreException {
        Cliente cliente = new Cliente();
        if (elementCliente.getChild("nombre").getValue().isEmpty()) {
            throw new ClienteNoNombreException(null, "Cliente " + elementCliente.getChild("identificador").getValue() 
                    + " nombre inválido vacío.");
        }
        cliente.setNombre(elementCliente.getChild("nombre").getValue());
        cliente.setDireccion(elementCliente.getChild("direccion").getValue());
        cliente.setIdentificador(elementCliente.getChild("identificador").getValue());
        cliente.setTelefono(elementCliente.getChild("telefono").getValue());
        cliente.setPagina(elementCliente.getChild("pagina").getValue());
        return cliente;
    }
}
